package model;

import hbtDAO.HibernateTemaDAO;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;


import beans.CategoriaView;
import beans.RankingView;
import beans.TemaView;

@Entity
@Table(name="Tema")
public class Tema {
	
	@Id
	@Column(name="Id_Tema")
	//@GeneratedValue(strategy = GenerationType.AUTO)
	private Long idTema;
	
	@Column(name="Titulo",length=100)
	private String titulo;
	
	@Column(name="Introduccion",columnDefinition= "ntext")
	private String introduccion;
	
	@Column(name="Contenido",columnDefinition= "ntext")
	private String contenido;
	
	@Column(name="Cantidad_Visitas")
	private Integer cantidadVisitas;
	
	@OneToOne
	@JoinColumn(name="Id_Usuario")
	private Usuario creador;
	
	@OneToOne
	@JoinColumn(name="Id_EstadoTema")
	private EstadoTema estado;
	
	@Column(name="Fecha_Creacion")
	private Date fechaCreacion;
	
	@OneToMany(fetch=FetchType.EAGER)
	@JoinColumn(name="Id_Tema")//(name="Id_Tema")
	private List<Ranking> valoraciones;
	
	@ManyToOne
	@JoinColumn(name="Id_Categoria")
	private Categoria categoria;

	public Tema() {
		super();
		this.valoraciones = new ArrayList<Ranking>();
	}
	
	public Tema(Long idTema, String titulo, String introduccion,
			String contenido, Integer cantidadVisitas, Usuario creador,
			EstadoTema estado, Date fechaCreacion,
			List<Ranking> valoraciones, Categoria categoria) {
		super();
		this.idTema = idTema;
		this.titulo = titulo;
		this.introduccion = introduccion;
		this.contenido = contenido;
		this.cantidadVisitas = cantidadVisitas;
		this.creador = creador;
		this.estado = estado;
		this.fechaCreacion = fechaCreacion;
		this.valoraciones = valoraciones;
		this.categoria = categoria;
	}
	
	

	public Long getIdTema() {
		return idTema;
	}
	public void setIdTema(Long idTema) {
		this.idTema = idTema;
	}
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getIntroduccion() {
		return introduccion;
	}
	public void setIntroduccion(String introduccion) {
		this.introduccion = introduccion;
	}
	public String getContenido() {
		return contenido;
	}
	public void setContenido(String contenido) {
		this.contenido = contenido;
	}
	public Integer getCantidadVisitas() {
		return cantidadVisitas;
	}
	public void setCantidadVisitas(Integer cantidadVisitas) {
		this.cantidadVisitas = cantidadVisitas;
	}
	public Usuario getCreador() {
		return creador;
	}
	public void setCreador(Usuario creador) {
		this.creador = creador;
	}
	public EstadoTema getEstado() {
		return estado;
	}
	public void setEstado(EstadoTema estado) {
		this.estado = estado;
	}
	public Date getFechaCreacion() {
		return fechaCreacion;
	}
	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public List<Ranking> getValoraciones() {
		return valoraciones;
	}
	public void setValoraciones(List<Ranking> valoraciones) {
		this.valoraciones = valoraciones;
	}



	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public TemaView getView() {
		List<RankingView> rank = new ArrayList<RankingView>();
		if(valoraciones!=null){
			for(Ranking item: this.valoraciones){
				rank.add(item.getView());
			}
		}
		CategoriaView cat = new	CategoriaView (this.categoria.getIdCategoria());		
		cat.setNombre(this.categoria.getNombre());
		return new TemaView(idTema, titulo, introduccion, contenido, cantidadVisitas, creador.getView(), estado.getView(), fechaCreacion, rank,cat);
	}



	@Override
	public String toString() {
		return "Tema [idTema=" + idTema + ", titulo=" + titulo
				+ ", introduccion=" + introduccion + ", contenido=" + contenido
				+ ", cantidadVisitas=" + cantidadVisitas + ", creador="
				+ creador + ", estado=" + estado + ", fechaCreacion="
				+ fechaCreacion + ", valoraciones=" + valoraciones + "]";
	}

	public void persistir() {
		HibernateTemaDAO.getInstancia().guardarUnTema(this);		
	}

	public boolean aprobar() {
		try
		{
			this.estado = new EstadoTema(1,"Aprobado",true);
			estado.persistir();
			this.persistir();
			return true;
		}
		catch(Exception e)
		{
			return false;	
		}
	}
	
	
	

}
